package org.jpro.common.jpa.repository;

import java.io.Serializable;

import javax.persistence.LockModeType;

import org.jpro.common.bean.BaseEntity;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * <P>功能描述 : 重写org.springframework.data.jpa.repository.JpaRepository 接口，使用自己的实现工厂，这样删除的操作可以做逻辑删除等等，
 * 扩展一些自己的方法 </P>
 * <P>File name : JpaRepository </P>
 * <P>Author : 王泽浩 </P>
 * <P>E-Mail : 1028625100@qq.com </P>
 * <P>Date : 2017/3/4 下午2:16</P>
 */
@NoRepositoryBean
public interface JpaRepository<T extends BaseEntity, ID extends Serializable>
        extends org.springframework.data.jpa.repository.JpaRepository<T, ID>, JpaSpecificationExecutor<T> {

    /**
     * 通过ID加锁查询
     */
    T findOne(ID id, LockModeType lockModeType);

    /**
     * 根据ID尽心逻辑删除
     * @param ids 需要删除的ID
     */
    void deleteByIds(Iterable<ID> ids);

    /**
     * 给实体加锁
     */
    void lock(T t, LockModeType lockModeType);

    void clear();

}
